home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / examples / perfmon / perfmon.s < prev   
Text File  |  1996-04-12  |  20KB  |  907 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * PerfMon                                                                      *
  4. *                                                                              *
  5. * Copyright © 1993,1994 by Daniel Weber                                        *
  6. * All Rights Reserved Worldwide                                                *
  7. *                                                                              *
  8. *                                                                              *
  9. *       Filename        perfmon.s                                              *
  10. *       Author          Daniel Weber                                           *
  11. *       Version         1.02                                                   *
  12. *       Start           30.10.93                                               *
  13. *                                                                              *
  14. *       Last Revision   20.11.93                                               *
  15. *                                                                              *
  16. ;-------------------------------------------------------------------------------
  17. *                                                                              *
  18. *       NOTE            Since AddPort(exec) attaches a message port structure  *
  19. *                       to the system's public message port list, and I        *
  20. *                       decided that the PerfMon ports are no public at all    *
  21. *                       no ports will be added to the system's public message  *
  22. *                       port list. Thus no AddPort() and no RemPort() are      *
  23. *                       needed.                                                *
  24. *                                                                              *
  25. ;-------------------------------------------------------------------------------
  26.  
  27.     output    'ram:perfmon'
  28.  
  29.     opt    o+,q+,ow-,qw-,sw-
  30.     verbose
  31.     base    progbase
  32.  
  33.     filenote    'PerfMon, Copyright © 1993,1994 by Daniel Weber'
  34.  
  35. ;    equfile        ram:perfmon.equ
  36. ;    creffile    ram:perfmon.cref
  37.  
  38. ;-------------------------------------------------------------------------------
  39.  
  40.     incdir    'include:'
  41.     incdir    'routines:'
  42.  
  43.     incequ    'LVO.s'
  44.     include    'basicmac.r'
  45.  
  46.     include    'devices/timer.i'
  47.     include    'exec/execbase.i'
  48.     include    'exec/tasks.i'
  49.     include    'exec/ports.i'
  50.     include    'intuition/intuition.i'
  51.     include    'dos/dos.i'
  52.     include    'support.mac'
  53.     include    'tasktricks.r'
  54.  
  55. ;-------------------------------------------------------------------------------
  56.  
  57. version        equr    "1.02"
  58. gea_progname    equr    "PerfMon"
  59.  
  60. ;-- startup control  --
  61. cws_V36PLUSONLY    set    1
  62. cws_DETACH    set    1            ;detach from CLI
  63. cws_EASYLIB    set    1
  64.  
  65. ;-- user definitions --
  66. AbsExecBase    equ    4
  67.  
  68. DOS.LIB        equ    36
  69. INTUITION.LIB    equ    36
  70. GRAPHICS.LIB    equ    36
  71.  
  72. Daemon_Pri    equ    -128
  73.  
  74. seconds:    equ    1
  75. micros        equ    0            ;5*100000
  76.  
  77.  
  78. workspace    equ    32
  79.  
  80. WindowHeight    equ    12
  81. WindowWidth    equ    88
  82. textxstart:    equ    4
  83. textystart    equ    8
  84.  
  85.  
  86. ;-------------------------------------------------------------------------------
  87. progbase:
  88.     jmp    AutoDetach(pc)
  89.     dc.b    "DAW!"
  90.     dc.b    0,"$VER: ",gea_progname," ",version," (",__date2,")",0
  91.     even
  92.  
  93. ;----------------------------
  94. clistartup:
  95.     lea    progbase(pc),a5
  96.     lea    PrintTitle(pc),a0
  97.     bsr    ReplySync
  98.  
  99.     sub.l    a0,a0                ;detach completely
  100.     bsr    ReplySync
  101.  
  102. wbstartup:
  103.     lea    progbase(pc),a5
  104.  
  105.     lea    dxstart(pc),a1            ;clear DX area
  106.     move.w    #(dxend-dxstart)/2-1,d7
  107. .clr:    clr.w    (a1)+
  108.     dbra    d7,.clr
  109.  
  110.     InitList_    TimePort+MP_MSGLIST    ; init port structures
  111.     InitList_    TimePort2+MP_MSGLIST    ; correctly (empty list)
  112.  
  113. .allocsignal:                    ;allocate handshake signal
  114.     move.l    4.w,a6
  115.     move.l    ThisTask(a6),MasterTask(a5)
  116.  
  117.     moveq    #-1,d0
  118.     jsr    _LVOAllocSignal(a6)
  119.     move.l    d0,HandShakeSig(a5)
  120.     bmi    .nosignal
  121.     moveq    #0,d1
  122.     bset    d0,d1
  123.     move.l    d1,HandShakeMask(a5)
  124.  
  125.     moveq    #-1,d0
  126.     jsr    _LVOAllocSignal(a6)
  127.     move.l    d0,SignalNumber2(a5)
  128.     move.l    d0,d2
  129.     bmi    .nosignal2
  130.  
  131. .port:    lea    TimePort2(pc),a1
  132.     move.l    4.w,a6
  133.     move.b    #NT_MSGPORT,LN_TYPE(a1)
  134.     move.b    #PA_SIGNAL,MP_FLAGS(a1)
  135.     move.b    d2,MP_SIGBIT(a1)
  136.     move.l    ThisTask(a6),MP_SIGTASK(a1)
  137.     clr.l    LN_NAME(a1)
  138. ;    jsr    _LVOAddPort(a6)
  139.  
  140. .device:                    ;open timer device
  141.     lea    TimeRequest2(pc),a1
  142.     moveq    #UNIT_MICROHZ,d0
  143.     moveq    #0,d1
  144.     lea    TimerName(pc),a0
  145.     jsr    _LVOOpenDevice(a6)
  146.     tst.l    d0
  147.     bne    .freesignal
  148.     seq    timeropened(a5)            ;flag if timer.device open
  149.     move.l    TimeRequest+IO_DEVICE(pc),TimerBase(a5)
  150.  
  151.  
  152. .main:    lea    NewWindowStructure(pc),a0
  153.     move.l    IntBase(pc),a6
  154.     jsr    _LVOOpenWindow(a6)
  155.     move.l    d0,Windowhandle(a5)
  156.     beq.s    .cleanup
  157.     move.l    d0,a0                ;add menu list to window
  158.     lea    MenuList(pc),a1
  159.     jsr    _LVOSetMenuStrip(a6)
  160.  
  161.     move.l    Windowhandle(pc),a3        ;set font and pens...
  162.     move.l    wd_RPort(a3),a3
  163.     move.l    a3,a1
  164.     moveq    #1,d0
  165.     move.l    GfxBase(pc),a6
  166.     jsr    _LVOSetAPen(a6)
  167.     move.l    a3,a1
  168.     moveq    #0,d0
  169.     jsr    _LVOSetBPen(a6)
  170.  
  171.     lea    Topaz80(pc),a0
  172.     jsr    _LVOOpenFont(a6)
  173.     move.l    d0,WindowFont(a5)
  174.     beq.s    .install
  175.     move.l    d0,a0
  176.     move.l    a3,a1
  177.     jsr    _LVOSetFont(a6)
  178.  
  179. .install:
  180.     bsr    InstallDaemon
  181.     beq    .nodaemon
  182.  
  183.     bsr    main
  184.  
  185.  
  186. .killslave:
  187.     move.l    4.w,a6
  188.     jsr    _LVOForbid(a6)
  189.     lea    TaskReady(a6),a0    ;slave should be in the ready list
  190.     lea    DaemonNameReal(pc),a1
  191.     jsr    _LVOFindName(a6)
  192.     tst.l    d0
  193.     beq.s    .nos
  194.     move.l    #SIGBREAKF_CTRL_C,d0
  195.     move.l    DaemonTask(pc),d1
  196.     beq.s    .nos
  197.     move.l    d1,a1
  198.     jsr    _LVOSignal(a6)
  199. .nos:    jsr    _LVOPermit(a6)
  200.  
  201. ;
  202. ; clean up and exit
  203. ;
  204. .nodaemon:                ;NOTE:  if a setup error occures, no
  205. .nosignal:                ;message will be reported to the user
  206. .nosignal2:                ;
  207.  
  208. .cleanup:                ;close window
  209.     move.l    WindowFont(pc),d0
  210.     beq.s    .closewd
  211.     move.l    d0,a1
  212.     move.l    GfxBase(pc),a6
  213.     jsr    _LVOCloseFont(a6)
  214.  
  215. .closewd:
  216.     move.l    Windowhandle(pc),d6
  217.     beq.s    .closedevice
  218.     move.l    d6,a0
  219.     move.l    IntBase(pc),a6
  220.     jsr    _LVOClearMenuStrip(a6)
  221.     move.l    d6,a0
  222.     jsr    _LVOCloseWindow(a6)
  223.  
  224. .closedevice:
  225.     tst.b    timeropened(a5)        ;timer.device open?
  226.     beq.s    .freesignal
  227.     lea    TimeRequest2(pc),a1
  228.     move.l    4.w,a6
  229.     jsr    _LVOCloseDevice(a6)
  230.  
  231. .freesignal:                ;free the handshake & timer signal (good)
  232.     move.l    SignalNumber2(pc),d0
  233.     bmi.s    .sig1
  234.     move.l    4.w,a6
  235.     jsr    _LVOFreeSignal(a6)
  236.  
  237. .rport:
  238. ;    lea    TimePort2(pc),a1
  239. ;    move.l    4.w,a6
  240. ;    jsr    _LVORemPort(a6)
  241.  
  242. .sig1:    tst.l    HandShakeMask(a5)
  243.     beq.s    .exit
  244.     move.l    4.w,a6
  245.     move.l    HandShakeSig(pc),d0
  246.     jsr    _LVOFreeSignal(a6)
  247.  
  248. .exit:    moveq    #0,d0            ;exit...
  249.     bra    ReplyWBMsg
  250.  
  251.  
  252.  
  253. ;-------------------------------------------------------------------------------
  254. *
  255. * main
  256. *
  257. ;-------------------------------------------------------------------------------
  258.  
  259.  
  260. main:    lea    progbase(pc),a5
  261.  
  262. .wait:    lea    TimeRequest2(pc),a1
  263.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  264.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  265.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  266.     move.l    4.w,a6
  267.     jsr    _LVODoIO(a6)                ;get system time...
  268.     move.l    TimerBase(pc),a6
  269.     lea    ResultTime2(pc),a0
  270.     lea    TimeRequest2+IOTV_TIME(pc),a1
  271.     clr.l    TV_SECS(a0)
  272.     clr.l    TV_MICRO(a0)
  273.     jsr    _LVOSubTime(a6)
  274.     clr.l    ResultTime+TV_SECS(a5)
  275.     clr.l    ResultTime+TV_MICRO(a5)
  276.  
  277.     lea    TimeRequest2(pc),a1
  278.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  279.     move.w    #TR_ADDREQUEST,IO_COMMAND(a1)
  280.     move.l    #seconds,IOTV_TIME+TV_SECS(a1)
  281.     move.l    #micros,IOTV_TIME+TV_MICRO(a1)
  282.     move.l    4.w,a6
  283.     jsr    _LVOSendIO(a6)                ;wait time (1 sec)
  284.  
  285. .loop:    move.l    SignalNumber2(pc),d1
  286.     moveq    #0,d0
  287.     bset    d1,d0
  288.     move.l    d0,d7
  289.     move.l    Windowhandle(pc),a0
  290.     move.l    wd_UserPort(a0),a0
  291.     move.l    a0,a3
  292.     move.b    MP_SIGBIT(a0),d1
  293.     bset    d1,d0
  294.     move.l    4.w,a6
  295.     jsr    _LVOWait(a6)
  296.  
  297.     cmp.l    d7,d0
  298.     beq.s    .timer
  299.  
  300. ;
  301. ; a window message received... (only MENUPICK as IDCMP set)
  302. ;
  303. ; a3: wd_UserPort
  304. ; a6: execbase
  305. ;
  306. .window:
  307.     move.l    4.w,a6
  308.     move.l    Windowhandle(pc),a0
  309.     move.l    wd_UserPort(a0),a0
  310.     jsr    _LVOGetMsg(a6)
  311.     move.l    d0,a1
  312.     move.l    a1,d0
  313.     beq.s    .exit
  314.     move.l    im_Class(a1),d4        ;IDCMP flags
  315.     move.w    im_Code(a1),d5        ;menu number
  316.     move.l    im_IAddress(a1),d6    ;pointer to a gadget or menu item etc.
  317.     jsr    _LVOReplyMsg(a6)
  318.  
  319.     lea    .eventtable(pc),a0
  320. .event:    move.w    (a0)+,d0
  321.     beq.s    .window
  322.     cmp.w    d0,d5
  323.     movea.l    (a0)+,a1
  324.     bne.s    .event
  325.     jsr    (a1)
  326.     bra.s    .window
  327. .exit:    tst.b    quitflag(a5)        ;exit if quitflag set
  328.     beq    .loop
  329.     rts
  330.  
  331.  
  332. .eventtable:                ;dc.w <im_Code>; dc.l <routine>
  333.     dc.w    (-1<<11)|(0<<5)|(0)    ;About
  334.     dc.l    DoAbout
  335.     dc.w    (-1<<11)|(1<<5)|(0)    ;Quit
  336.     dc.l    DoQuit
  337.     dc.w    0
  338.  
  339.  
  340. ;
  341. ; message received from timer...
  342. ;
  343. ; a6: execbase
  344. ;
  345. .timer:
  346.     move.l    4.w,a6
  347.     jsr    _LVOForbid(a6)
  348.     lea    TimeRequest2(pc),a1
  349.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  350.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  351.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  352.     jsr    _LVODoIO(a6)                ;get system time
  353.     move.l    TimerBase(pc),a6
  354.     lea    ResultTime2(pc),a0
  355.     lea    TimeRequest2+IOTV_TIME(pc),a1
  356.     jsr    _LVOAddTime(a6)                ;=> passed time
  357.  
  358. .evaluate:
  359.     move.l    ResultTime2+TV_SECS(pc),d0
  360.     move.l    #1000000,d1                ;10^6
  361.     bsr    mulu32
  362.     add.l    ResultTime2+TV_MICRO(pc),d0        ;passed time in micros
  363.     move.l    d0,d7
  364.  
  365.     move.l    ResultTime+TV_SECS(pc),d0
  366.     move.l    #1000000,d1                ;10^6
  367.     bsr    mulu32
  368.     add.l    ResultTime+TV_MICRO(pc),d0        ;slave time in micros
  369.  
  370.     move.l    d7,d4
  371.     sub.l    d0,d7
  372.     exg    d7,d0
  373.     move.l    #1000,d1
  374.     bsr    mulu32
  375.     move.l    d4,d1
  376.     bsr    divu32
  377.     divu    #10,d0
  378.     move.l    d0,d1
  379.     swap    d1                    ;remainder
  380.  
  381.     move.l    4.w,a6
  382.     jsr    _LVOPermit(a6)
  383.  
  384.     move.w    d0,rawlist(a5)
  385.     move.w    d1,rawlist+2(a5)
  386.  
  387.     lea    cpuloadtxt(pc),a0
  388.     lea    rawlist(pc),a1
  389.     lea    workbuffer(pc),a3
  390.     bsr    DoRawFmt
  391.  
  392.     move.l    GfxBase(pc),a6
  393.     move.l    Windowhandle(pc),a1
  394.     move.l    wd_RPort(a1),a1
  395.     move.l    a1,a3
  396.     moveq    #textxstart,d0
  397.     moveq    #textystart,d1
  398.     jsr    _LVOMove(a6)
  399.     move.l    a3,a1
  400.     lea    workbuffer(pc),a0
  401.     moveq    #-1,d0
  402.     move.l    a0,a3
  403. .cnt:    addq.l    #1,d0
  404.     tst.b    (a3)+
  405.     bne.s    .cnt
  406.     jsr    _LVOText(a6)
  407.     clr.l    ResultTime+TV_SECS(a5)
  408.     clr.l    ResultTime+TV_MICRO(a5)
  409.     bra    .wait
  410.  
  411.  
  412.  
  413.  
  414. ;------------------------------------------------
  415. ;
  416. ; DoQuit    - (CCR =>  0: don't  -:quit)
  417. ;
  418. DoQuit:
  419.     st    quitflag(a5)
  420.     rts
  421.  
  422.     
  423. ;------------------------------------------------
  424. ;
  425. ; DoAbout    - (CCR => must be 0)
  426. ;
  427. DoAbout:
  428.     move.l    IntBase(pc),a6
  429.     move.l    Windowhandle(pc),a0
  430.     lea    easystruct(pc),a1
  431.     suba.l    a2,a2
  432.     lea    rawlist(pc),a3
  433.     jsr    _LVOEasyRequestArgs(a6)
  434.     rts
  435.  
  436.  
  437. ;-------------------------------------------------------------------------------
  438. *
  439. * subroutines
  440. *
  441. ;-------------------------------------------------------------------------------
  442.  
  443.  
  444.  
  445. ;------------------------------------------------
  446. ;
  447. ; (simple) arithmetic subroutines
  448. ;
  449. ; d0=d0*d1
  450. ;
  451. ; d0/d1/d5/d6 affected...
  452. ;
  453. mulu32:
  454.     move.l    d0,d6
  455.     move.w    d0,d5
  456.     mulu    d1,d5            ;lo*lo
  457.     swap    d1
  458.     mulu    d1,d0            ;hi*lo
  459.     swap    d0
  460.     add.l    d5,d0
  461.     swap    d6
  462.     move.w    d6,d5
  463.     mulu    d1,d5            ;hi*hi
  464.     swap    d1
  465.     mulu    d1,d6            ;lo*hi
  466.     swap    d6
  467.     add.l    d6,d0
  468.     rts
  469.  
  470. ;
  471. ; d0=d0/d1 (divu.l d1,d0)
  472. ; => d2: remainder
  473. ;
  474. ;
  475. ; d0/d1/d2/d5/d6 affected
  476. ;
  477. divu32:
  478.     cmp.l    d0,d1
  479.     bls.s    1$
  480.     move.l    d0,d2
  481.     moveq    #0,d0
  482.     rts
  483.  
  484. 1$:    moveq    #0,d2
  485.     moveq    #0,d5
  486.     moveq    #31,d6
  487. \loop:    add.l    d0,d0
  488.     addx.l    d2,d2
  489.     add.l    d5,d5
  490.     cmp.l    d1,d2
  491.     dbge    d6,\loop
  492.     blt.s    \out
  493.     sub.l    d1,d2
  494.     addq.b    #1,d5
  495.     dbra d6,\loop
  496. \out:    move.l    d5,d0
  497.     rts
  498.  
  499.  
  500. ;------------------------------------------------
  501. ;
  502. ; PrintTitle    - print title to the StdOut channel using the parent task...
  503. ;
  504. PrintTitle:
  505.     lea    progbase(pc),a5
  506.     lea    TitleText(pc),a0
  507.     printtext_    ,,,bra
  508.  
  509.  
  510. ;------------------------------------------------
  511. ;
  512. ; DoRawFmt    - Format a string
  513. ;
  514. ; a0: format
  515. ; a1: data stream
  516. ; a3: dest. buffer
  517. ;
  518. DoRawFmt:
  519.     movem.l    d0-a6,-(a7)
  520.     lea    .setin(pc),a2
  521.     move.l    4.w,a6
  522.     jsr    _LVORawDoFmt(a6)
  523.     movem.l    (a7)+,d0-a6
  524.     rts
  525.  
  526. .setin:    move.b    d0,(a3)+
  527.     rts
  528.  
  529.  
  530. ;------------------------------------------------
  531. ;
  532. ; InstallDaemon    - install a 'busy looping' slave process
  533. ;
  534. ; => d0: daemon task structure (CCR)
  535. ;
  536. InstallDaemon:
  537.     lea    progbase(pc),a5
  538.     move.l    4.w,a6
  539.  
  540.     lea    DaemonName(pc),a0        ; generate a unique process name
  541.     lea    rawlist(pc),a1
  542.     move.l    ThisTask(a6),(a1)
  543.     lea    DaemonNameReal(pc),a3
  544.     bsr    DoRawFmt
  545.  
  546.     jsr    _LVOForbid(a6)
  547.  
  548.     mea    DaemonNameReal(pc),d1
  549.     moveq    #Daemon_Pri,d2
  550.     mea    DaemonCode-4(pc),d3
  551.     lsr.l    #2,d3                ;BCPL
  552.     move.l    #700,d4                ;stack
  553.     move.l    DosBase(pc),a6
  554.     jsr    _LVOCreateProc(a6)
  555.  
  556.     move.l    4.w,a6
  557.     jsr    _LVOPermit(a6)            ;does not affect d0
  558.  
  559.     move.l    d0,DaemonTask(a5)
  560.     beq.s    1$
  561.  
  562.     move.l    HandShakeMask(pc),d0        ;wait for reply (if started)
  563.     jsr    _LVOWait(a6)
  564.     move.l    DaemonTask(pc),d0
  565. 1$:    rts
  566.  
  567.  
  568.  
  569. ;
  570. ; daemon code
  571. ;
  572.     align.l
  573.     dc.l    0                ;length
  574.     dc.l    0
  575.  
  576. DaemonCode:
  577.     lea    progbase(pc),a5
  578.     clr.l    DaemonTask(a5)
  579.     pea    de_signal(pc)            ;if error  ->  de_signal
  580.  
  581.     moveq    #-1,d0                ;allocate signal bit for port
  582.     move.l    4.w,a6
  583.     jsr    _LVOAllocSignal(a6)
  584.     move.l    d0,SignalNumber(a5)
  585.     move.l    d0,d2
  586.     bmi    de_exit
  587.  
  588. .port:    lea    TimePort(pc),a1            ;add port
  589.     move.l    4.w,a6
  590.     move.b    #NT_MSGPORT,LN_TYPE(a1)
  591.     move.b    #PA_SIGNAL,MP_FLAGS(a1)
  592.     move.b    d2,MP_SIGBIT(a1)
  593.     move.l    ThisTask(a6),MP_SIGTASK(a1)
  594.     clr.l    LN_NAME(a1)
  595. ;    jsr    _LVOAddPort(a6)
  596.  
  597. .device:                    ;open timer device
  598.     lea    TimeRequest(pc),a1
  599.     moveq    #UNIT_MICROHZ,d0
  600.     moveq    #0,d1
  601.     lea    TimerName(pc),a0
  602.     jsr    _LVOOpenDevice(a6)
  603.     tst.l    d0
  604.     bne    de_remport
  605.     move.l    TimeRequest+IO_DEVICE(pc),TimerBase(a5)
  606.     beq    de_closedevice
  607.  
  608.     move.l    ThisTask(a6),a0
  609.     move.l    a0,DaemonTask(a5)
  610.     mea    Switch(pc),TC_SWITCH(a0)
  611.     mea    Launch(pc),TC_LAUNCH(a0)
  612.     or.b    #TF_SWITCH|TF_LAUNCH,TC_FLAGS(a0)
  613.  
  614.     addq.l    #4,a7                ;remove 'de_signal' from stack
  615.     bsr    de_signal
  616.  
  617. waitloop:                    ;busy wait loop
  618.     move.l    #$1000,d7
  619.     move.l    d7,d1
  620.     moveq     #0,d0
  621.     move.l    4.w,a6
  622.     jsr    _LVOSetSignal(a6)
  623.     and.l    d7,d0                ;Ctrl-C?
  624.     beq.s    waitloop
  625.  
  626.     move.l    ThisTask(a6),a0
  627.     and.b    #(~(TF_SWITCH|TF_LAUNCH))&$ff,TC_FLAGS(a0)
  628.     clr.l    TC_SWITCH(a0)
  629.     clr.l    TC_LAUNCH(a0)
  630.  
  631.  
  632. de_closedevice:                    ;close timer device
  633.     lea    TimeRequest(pc),a1
  634.     move.l    4.w,a6
  635.     jsr    _LVOCloseDevice(a6)
  636.  
  637. de_remport:                    ;remove port
  638. ;    lea    TimePort(pc),a1
  639. ;    move.l    4.w,a6
  640. ;    jsr    _LVORemPort(a6)
  641.  
  642. de_freesignal:                    ;free signal
  643.     move.l    SignalNumber(pc),d0
  644.     bmi.s    de_exit
  645.     move.l    4.w,a6
  646.     jsr    _LVOFreeSignal(a6)
  647.  
  648. de_exit:
  649.     rts
  650.  
  651. ;
  652. ; send a signal to the master task
  653. ;
  654. de_signal:
  655.     move.l    4.w,a6
  656.     move.l    HandShakeMask(pc),d0
  657.     move.l    MasterTask(pc),a1
  658.     jmp    _LVOSignal(a6)
  659.  
  660.  
  661.  
  662. DaemonName:    dc.b    gea_progname,"_slave.%08lx",0
  663. DaemonNameReal:    dc.b    gea_progname,"_slave.00000000",0
  664.         even
  665.  
  666.  
  667.  
  668. ;-------------------------------------------------------------------------------
  669. *
  670. * Switch & Launch
  671. *
  672. ;-------------------------------------------------------------------------------
  673.  
  674. ;
  675. ; task loses CPU
  676. ;
  677. Switch:
  678.     movem.l    d0-a6,-(a7)
  679.     move.l    4.w,a6
  680.     lea    TimeRequest(pc),a1
  681.     mea    TimePort(pc),MN_REPLYPORT(a1)
  682.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  683.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  684.     jsr    _LVODoIO(a6)
  685.     move.l    TimerBase(pc),a6
  686.     lea    ResultTime(pc),a0
  687.     lea    TimeRequest+IOTV_TIME(pc),a1
  688.     jsr    _LVOAddTime(a6)
  689.     movem.l    (a7)+,d0-a6
  690.     rts
  691.  
  692. ;
  693. ; task gets CPU
  694. ;
  695. Launch:    
  696.     movem.l    d0-a6,-(a7)
  697.     move.l    4.w,a6
  698.     lea    TimeRequest(pc),a1
  699.     mea    TimePort(pc),MN_REPLYPORT(a1)
  700.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  701.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  702.     jsr    _LVODoIO(a6)
  703.     move.l    TimerBase(pc),a6
  704.     lea    ResultTime(pc),a0
  705.     lea    TimeRequest+IOTV_TIME(pc),a1
  706.     jsr    _LVOSubTime(a6)
  707.     movem.l    (a7)+,d0-a6
  708.     rts
  709.  
  710.  
  711.  
  712. ;-------------------------------------------------------------------------------
  713. *
  714. * external routines
  715. *
  716. ;-------------------------------------------------------------------------------
  717.     include    startup4.r
  718.  
  719.  
  720. ;-------------------------------------------------------------------------------
  721. *
  722. * data area
  723. *
  724. ;-------------------------------------------------------------------------------
  725. processname:    dc.b    gea_progname,0
  726. TimerName:    dc.b    "timer.device",0
  727.  
  728. TitleText:    dc.b    $9b,"1m",gea_progname,$9b,"0m v",version
  729.         dc.b    " - Written 1993 by Daniel Weber",$a,0
  730.  
  731. cpuloadtxt:    dc.b    " %3d.%1d%%  ",0
  732.         even
  733.  
  734. ;
  735. ; easy requester structure
  736. ;
  737. easystruct:    dc.l    EasyStruct_SIZEOF
  738.         dc.l    0            ;flags
  739.         dc.l    .title            ;title
  740.         dc.l    .about
  741.         dc.l    .ok
  742. .title:        dc.b    gea_progname," v",version," - About...",0
  743. .ok:        dc.b    "Continue",0
  744. .about:        dc.b    gea_progname," v",version,$a
  745.         dc.b    "Written 1993 by Daniel Weber",$a
  746.         dc.b    "(assembled on the ",__date,")",$a,$a
  747.         dc.b    "Written using the ProAsm assembler.",$a,$a
  748.         dc.b    "This program is Public Domain.",$a
  749.         dc.b    "No Warranty, use at your own risk!",$a,0
  750.         even
  751.  
  752.  
  753. ;
  754. ; window and its gadget(s)
  755. ;
  756. NewWindowStructure:
  757.     dc.w    0,0        ;window XY origin relative to TopLeft of screen
  758.     dc.w    WindowWidth,WindowHeight    ;window width and height
  759.     dc.b    0,1                ;detail and block pens
  760.     dc.l    MENUPICK            ;IDCMP flags
  761.     dc.l    WFLG_SMART_REFRESH        ;other window flags
  762.     dc.l    Gadget1                ;first gadget in gadget list
  763.     dc.l    0                ;custom CHECKMARK imagery
  764.     dc.l    0                ;window title
  765.     dc.l    0                ;custom screen pointer
  766.     dc.l    0                ;custom bitmap
  767.     dc.w    WindowWidth,WindowHeight    ;minimum width and height
  768.     dc.w    WindowWidth,WindowHeight    ;maximum width and height
  769.     dc.w    WBENCHSCREEN            ;destination screen type
  770.  
  771. ;
  772. ; used GTYP_WDRAGGING gadget type to simulate a dragbar (V37)
  773. ;
  774. Gadget1:dc.l    0        ;next gadget
  775.     dc.w    0,0        ;origin XY of hit box relative to window TopLeft
  776.     dc.w    0,0        ;hit box width and height
  777.     dc.w    GADGHBOX+GRELWIDTH+GRELHEIGHT+GADGHIMAGE    ;flags
  778.     dc.w    GADGIMMEDIATE    ;activation flags
  779.     dc.w    GTYP_WDRAGGING    ;gadget type flags
  780.     dc.l    0        ;gadget border or image to be rendered
  781.     dc.l    0        ;alternate imagery for selection
  782.     dc.l    0        ;first IntuiText structure
  783.     dc.l    0        ;gadget mutual-exclude long word
  784.     dc.l    .info        ;SpecialInfo structure
  785.     dc.w    0        ;user-definable data (ID)
  786.     dc.l    0        ;pointer to user-definable data
  787.  
  788. .info:    dc.w    0        ;PropInfo flags
  789.     dc.w    0,1800        ;horizontal and vertical pot values
  790.     dc.w    2000,256    ;horizontal and vertical body values
  791.     dc.w    0,0,0,0,0,0    ;Intuition initialized and maintained variables
  792.  
  793. ;
  794. ; menu structure of perfmon
  795. ;
  796. MenuList:
  797.     dc.l    0            ;next Menu structure
  798.     dc.w    0,0            ;XY origin of Menu hit box
  799.     dc.w    63,0            ;Menu hit box width and height
  800.     dc.w    MENUENABLED        ;Menu flags
  801.     dc.l    MenuName        ;text of Menu name
  802.     dc.l    MenuItem1        ;MenuItem linked list pointer
  803.     dc.w    0,0,0,0            ;Intuition variables
  804.  
  805.  
  806. MenuItem1:                ;ABOUT
  807.     dc.l    MenuItem2        ;next MenuItem structure
  808.     dc.w    0,0            ;XY of Item hitbox
  809.     dc.w    84,10            ;hit box width and height
  810.     dc.w    ITEMTEXT+ITEMENABLED+HIGHCOMP    ;Item flags
  811.     dc.l    0
  812.     dc.l    .text            ;Item render
  813.     dc.l    0            ;Select render
  814.     dc.b    0            ;alternate command-key
  815.     dc.b    0            ;fill byte
  816.     dc.l    0            ;SubItem list
  817.     dc.w    MENUNULL
  818.  
  819. .text:    dc.b    0,0            ;front and back text pens
  820.     dc.b    RP_JAM1,0        ;drawmode and fill byte
  821.     dc.w    2,1            ;XY origin
  822.     dc.l    Topaz80            ;font pointer or NULL for default
  823.     dc.l    texttext1        ;pointer to text
  824.     dc.l    0            ;next IntuiText structure
  825.  
  826. MenuItem2:                ;QUIT
  827.     dc.l    0            ;next MenuItem structure
  828.     dc.w    0,12            ;XY of Item hitbox
  829.     dc.w    84,10            ;hit box width and height
  830.     dc.w    ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP    ;Item flags
  831.     dc.l    0
  832.     dc.l    .text            ;Item render
  833.     dc.l    0            ;Select render
  834.     dc.b    'Q'            ;alternate command-key
  835.     dc.b    0            ;fill byte
  836.     dc.l    0            ;SubItem list
  837.     dc.w    MENUNULL        ;MENUNULL=$FFFF
  838.  
  839. .text:    dc.b    0,0            ;front and back text pens
  840.     dc.b    RP_JAM1,0        ;drawmode and fill byte
  841.     dc.w    2,1            ;XY origin
  842.     dc.l    Topaz80            ;font pointer or NULL for default
  843.     dc.l    texttext2        ;pointer to text
  844.     dc.l    0            ;next IntuiText structure
  845.  
  846. MenuName:    dc.b    'Project',0
  847. texttext1:    dc.b    'About...',0
  848. texttext2:    dc.b    'Quit',0
  849.         even
  850.  
  851. ;
  852. ; font...
  853. ;
  854.     align.l
  855. Topaz80:dc.l    .font            ;ta_name
  856.     dc.w    8            ;ta_ysize
  857.     dc.b    0,1            ;ta_style, ta_flags
  858. .font:    dc.b    "topaz.font",0
  859.     even
  860.  
  861.  
  862.  
  863.  
  864. dxstart:
  865. ;-------------------------------------------------------------------------------
  866. InitSP:        dx.l    1        ; initial sp
  867.  
  868. ;-- system ------------------------------------------------
  869. Windowhandle:    dx.l    1        ; window handle
  870. WindowFont:    dx.l    1        ; window font
  871. tickcounter:    dx.w    1        ; tick counter for intuiticks
  872. MasterTask:    dx.l    1        ; task address for PerfMon
  873. rawlist:    dx.l    1        ; rawlist for DoRawFmt
  874.  
  875. ;-- daemon ------------------------------------------------
  876. DaemonTask:    dx.l    1        ; daemon task
  877. HandShakeSig:    dx.l    1        ; signal number
  878. HandShakeMask:    dx.l    1        ; sigbit mask for task communication
  879.  
  880. ;-- flags -------------------------------------------------
  881. quitflag:    dx.b    1        ; 0: do not              -: quit...
  882. timeropened:    dx.b    1        ; 0: timer devive not... -: open
  883.         aligndx.w
  884.  
  885. ;-- timer -------------------------------------------------
  886. TimerBase:    dx.l    1        ; timer base (daemon)
  887. TimerBase2:    dx.l    1        ; timer base (master)
  888. SignalNumber:    dx.l    1        ; signal number for port (demon task)
  889. SignalNumber2:    dx.l    1        ; signal number for port (master task)
  890.  
  891. TimeRequest:    dx.b    IOTV_SIZE    ; timer request structure (daemon)
  892. TimeRequest2:    dx.b    IOTV_SIZE    ; timer request structure (master)
  893.  
  894. ResultTime:    dx.b    TV_SIZE        ; result time (daemon)
  895. ResultTime2:    dx.b    TV_SIZE        ; result time (master)
  896.  
  897. TimePort:    dx.b    MP_SIZE        ; (daemon)
  898. TimePort2:    dx.b    MP_SIZE        ; (master)
  899.  
  900. ;-- buffer ------------------------------------------------
  901. workbuffer:    dx.b    workspace
  902.  
  903. ;-------------------------------------------------------------------------------
  904.     aligndx.w
  905. dxend:
  906.     end
  907.